package xxl.robotlegs.framework.api 
{
	import flash.system.ApplicationDomain;
	import xxl.ioc.dependencyproviders.IFallbackDependencyProvider;
	import xxl.ioc.mapping.InjectionMapping;
	import xxl.ioc.reflection.IReflector;
	import xxl.ioc.signals.MappingSignal;
	import xxl.ioc.typedescriptions.TypeDescription;
	
	/**
	 * ...
	 * @author XXL
	 */
	public interface IInjector 
	{
		function get mappingSignal():MappingSignal;
		function get reflector():IReflector;
		function set parent(parentInjector:IInjector):void;
		function get parent():IInjector;
		function set applicationDomain(applicationDomain:ApplicationDomain):void;
		function get applicationDomain():ApplicationDomain;
		function set fallbackProvider(provider:IFallbackDependencyProvider):void;
		function get fallbackProvider():IFallbackDependencyProvider;
		function set blockParentFallbackProvider(value:Boolean):void;
		function get blockParentFallbackProvider():Boolean;
		function addTypeDescription(type:Class, description:TypeDescription):void;
		function getTypeDescription(type:Class):TypeDescription;
		function hasMapping(type:Class, name:String = ""):Boolean;
		function hasDirectMapping(type:Class, name:String = ""):Boolean;
		function map(type:Class, name:String = ""):InjectionMapping;
		function unmap(type:Class, name:String = ""):void;
		function satisfies(type:Class, name:String = ""):Boolean;
		function satisfiesDirectly(type:Class, name:String = ""):Boolean;
		function getMapping(type:Class, name:String = ""):InjectionMapping;
		function injectInto(target:Object):void;
		function getInstance(type:Class, name:String = "", targetType:Class = null):*;
		function getOrCreateNewInstance(type:Class):*;
		function instantiateUnmapped(type:Class):*;
		function destroyInstance(instance:Object):void;
		function teardown():void;
		function createChild(applicationDomain:ApplicationDomain = null):IInjector;
	}
	
}